#ifndef LISTA_DOBLE_H
#define LISTA_DOBLE_H

#if !defined(NULL)
#define NULL 0
#endif

#if !defined(FALSE)
#define FALSE 0
#endif

#if !defined(TRUE)
#define TRUE 1
#endif


typedef enum
{
    LD_PRIMERO=1,
    LD_SIGUIENTE=2,
    LD_ANTERIOR=3
    } TMovim;

typedef struct TNodoDoble
{
    void*  Elem;
    struct TNodoDoble *Sig;
    struct TNodoDoble *Ant;
    } TNodoDoble;

typedef struct
{
    TNodoDoble *Prim, *Cte;
    int TamanioDato;
    } TListaDoble;

/*
** Primitivas del TDA Lista Doble
*/


/* LD_Crear
@ PRE: LD no creada
@ POS: LD creada
*/
void LD_Crear (TListaDoble *pLD, int TamanioDato);

/* LD_Vacia
@ PRE: LD creada
@ POS: Si la lista esta vacia devuelve TRUE, sino FALSE
*/
int LD_Vacia (TListaDoble LD);

/* LD_Vaciar
@ PRE: LD creada
@ POS: Se eliminaron todos los elementos de LD
*/
void LD_Vaciar (TListaDoble *pLD);

/*
@ PRE: LD creada y no vacia
@ POS: Si M = LD_PRIMERO, el nuevo cte es el primero de la lista
       si M = LD_SIGUIENTE,
       si M = LD_ANTERIOR,
       Si pudo realizar el movimiento devuelve TRUE, sino FALSE
*/
int LD_MoverCte (TListaDoble *pLD, TMovim M );

/*
@ PRE: LD creada
@ POS: Se agrego E a la lista y es el nuevo corriente,
       si M = LD_PRIMERO o la lista esta vacia, se inserto como primero de la lista
       si M = LD_SIGUIENTE, se inserto despues del elemento coriente
       si M = LD_ANTERIOR, se inserto antes del elemento coriente
       Si pudo insertar el elemento devuelve TRUE, sino FALSE
*/
int LD_Insertar (TListaDoble *pLD, TMovim M, void* pE);


/*
@ PRE: LD creada y no vacia
@ POS: Se elimino el elemento corriente. El nuevo corriente es el siguiente de eliminado, o el anterior si este era el ultimo
*/
void LD_BorrarCte (TListaDoble *pLD);


/*
@ PRE: LD creada y no vacia
@ POS:
*/
void LD_ObtenerCte (TListaDoble LD, void* pE);


/*
@ PRE:
@ POS:
*/
void LD_ModificarCte (TListaDoble *pLD, void* pE);


#endif
